home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / tex / inputs / jmb.bst < prev    next >
Text File  |  1991-05-20  |  31KB  |  1,336 lines

  1. % BibTex `jmb' bibliography style
  2. % version = 1.20 of jmb.bst 1990 November 16
  3.  
  4. % Thomas Schneider
  5. % National Cancer Institute
  6. % Laboratory of Mathematical Biology
  7. % Frederick, Maryland  21702-1013
  8. % toms@ncifcrf.gov
  9. %
  10. % This file is available by anonymous ftp from ncifcrf.gov in pub/delila.
  11. %
  12. % TITLES can be turned on and off!
  13. %      Just nocite the reference TitlesOn in the paper (i.e. \nocite{TitlesOn})
  14. %      and have a bibliography article in your database with that cite key!
  15. % Without titles is Journal of Molecular Biology;
  16. % With titles is Journal of Theoretical Biology.
  17. %
  18. % WARNING: Since I use mostly article, book and inproceedings, these
  19. % are formatted pretty closely to the Journal of Theoretical Biology style
  20. % while other things are neglected.  Also, I can't guarantee that the style
  21. % is exactly right.
  22. %
  23. % The following documentation is identical from the source of jmb.bst,
  24. % which was the apalike.bst taken from the Clarkson archive on 1989 June 19.
  25. %
  26. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  27. % BibTeX `apalike' bibliography style (24-Jan-88 version)
  28. % Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
  29. % Copyright (C) 1988, all rights reserved.
  30. % Copying of this file is allowed, provided that if you make any changes at all
  31. % you name it something other than `apalike.bst'.
  32. % This restriction helps ensure that all copies are identical.
  33. % Differences between this style and `alpha' are generally heralded by a `%'.
  34. % The file btxbst.doc has the documentation for alpha.bst.
  35. %
  36. % This style should be used with the `apalike' LaTeX style (apalike.sty).
  37. % \cite's come out like "(Jones, 1986)" in the text but there are no labels
  38. % in the bibliography, and something like "(1986)" comes out immediately
  39. % after the author.  Author (and editor) names appear as last name, comma,
  40. % initials.  A `year' field is required for every entry, and so is either
  41. % an author (or in some cases, an editor) field or a key field.
  42. %
  43. % Editorial note:
  44. % Many journals require a style like `apalike', but I strongly, strongly,
  45. % strongly recommend that you not use it if you have a choice---use something
  46. % like `plain' instead.  Mary-Claire van Leunen (A Handbook for Scholars,
  47. % Knopf, 1979) argues convincingly that a style like `plain' encourages better
  48. % writing than one like `apalike'.  Furthermore the strongest arguments for
  49. % using an author-date style like `apalike'---that it's "the most practical"
  50. % (The Chicago Manual of Style, University of Chicago Press, thirteenth
  51. % edition, 1982, pages 400--401)---fall flat on their face with the new
  52. % computer-typesetting technology.  For instance page 401 anachronistically
  53. % states "The chief disadvantage of [a style like `plain'] is that additions
  54. % or deletions cannot be made after the manuscript is typed without changing
  55. % numbers in both text references and list."  LaTeX sidesteps the disadvantage.
  56. %
  57. % History:
  58. %   15-sep-86    (SK,OP)    Original version, by Susan King and Oren Patashnik.
  59. %   10-nov-86    (OP)    Truncated the sort.key$ string to the correct length
  60. %            in bib.sort.order to eliminate error message.
  61. %   24-jan-88    (OP)    Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
  62. %            apalike now sorts by author, then year, then title;
  63. %            THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
  64. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  65. %
  66. % The program was further modified by Tom Schneider:
  67. %
  68. %   1989 June 19 (TDS)  Renamed jmb.bst.  Items that do not have years were
  69. %        listed in the bibliography without identifiers.  However, they
  70. %        have identifiers in the text.  The identifier was added.
  71. %        Titles were removed :-(.
  72.  
  73. %   1989 October 2 (TDS)  Made labels in the paper use the & symbol rather
  74. %                  than `and', as required by JMB.
  75. %   1989 October 3 (TDS)  Made et~al. be in italics.
  76. %                  Removed comma after journal name.  (actually, all
  77. %                  mid sentence commas go!)
  78. %                  Made volume number be bold faced.
  79. %                  Converted colon (:) after volume number to a comma (,).
  80. %                  If a journal name does NOT end in a period, add
  81. %                  a comma after the name.
  82. %   1989 October 14 (TDS)  Without a year the program used to sort on the
  83. %                   title.  I made it sort on the cite$ if there is no year.
  84. %   1989 October 18 (TDS)  If there is one reference without a year, put
  85. %                   an "a" at the end of its label, so that it comes out
  86. %                   as (Smith, a) in the text.  in FUNCTION {forward.pass}
  87. %   1989 November 2 (TDS)  Unpublished papers now give the title.
  88. %   1989 November 18 (TDS)  TITLES can be turned on and off!
  89. %                   Just nocite the reference TitlesOn in the paper
  90. %                   and have a bibliography article in your database
  91. %                   with that cite key!
  92. %   1989 December 5 (TDS)  I can't stand sorting to fall back on the
  93. %                   titles of the article - no control!  So in function
  94. %                   bib.sort.order the default is now cite$.
  95. %   1990 November 14 (TDS) Changes to match JTB better:
  96. %                    Names in the bibliography are now connected
  97. %                    with "\&" instead of "and", since this fits JTB better.
  98. %                    "In" is now "In:".
  99. %                    "editors" and "editor" are now "eds" and "ed".
  100. %                    booktitle follows editors.  editors in parenthesis.
  101. %                    pp. and p. instead of pages and page.
  102. %                    location followed by colon (:) and then publisher.
  103.  
  104. ENTRY  % declare variables that have a value for each entry on the list
  105.   { address
  106.     author
  107.     booktitle
  108.     chapter
  109.     edition
  110.     editor
  111.     howpublished
  112.     institution
  113.     journal
  114.     key
  115. %    month        not used in apalike
  116.     note
  117.     number
  118.     organization
  119.     pages
  120.     publisher
  121.     school
  122.     series
  123.     title
  124.     type
  125.     volume
  126.     year
  127.   }
  128.   {}
  129.   { label extra.label sort.label }
  130.  
  131. INTEGERS { output.state before.all mid.sentence after.sentence after.block
  132.            docomma givetitles }
  133.  
  134. FUNCTION {init.state.consts}
  135. { #0 'before.all :=
  136.   #1 'mid.sentence :=
  137.   #2 'after.sentence :=
  138.   #3 'after.block :=
  139.  
  140.   #0 'docomma :=    % if it is 0 then don't do commas, otherwise do them.
  141. }
  142.  
  143. FUNCTION {init.toggle.switches}
  144. {% set switches for controlling the output!
  145.   #0 'givetitles := % if it is 0 then don't give titles, otherwise do them.
  146. }
  147.  
  148. STRINGS { s t }
  149.  
  150. FUNCTION {output.nonnull}
  151. { 's :=
  152.   output.state mid.sentence =
  153.  
  154. % %    { ", " * write$ }  % the comma here is responsible for every comma!
  155. % %                       % But JMB doesn't want commas, so away it goes!
  156. %      { " " * write$ }    % That does it!
  157.  
  158.     { % doing a comma is controlled specifically in JMB using docomma
  159.       docomma #0 =
  160.       { " " * write$ }
  161.       { ", " * write$ }
  162.       if$
  163.     }
  164.     { output.state after.block =
  165.     { add.period$ write$
  166.       newline$
  167.       "\newblock " write$
  168.     }
  169.     { output.state before.all =
  170.         'write$
  171.         { add.period$ " " * write$ }
  172.       if$
  173.     }
  174.       if$
  175.       mid.sentence 'output.state :=
  176.     }
  177.   if$
  178.   s
  179. }
  180.  
  181. FUNCTION {output}
  182. { duplicate$ empty$
  183.     'pop$
  184.     'output.nonnull
  185.   if$
  186. }
  187.  
  188. FUNCTION {output.check}
  189. { 't :=
  190.   duplicate$ empty$
  191.      {  t "title" =
  192.            { pop$ } % jmb ignores titles and does not object if missing
  193.            { pop$ "empty " t * " in " * cite$ * warning$ }
  194.         if$
  195.      }
  196.     'output.nonnull  % block periods
  197.     % { pop$  } % don't do anything
  198.   if$
  199. }
  200.  
  201. %    t "title" =
  202. %    { "zowie" warning$ }
  203. %    {  duplicate$ empty$
  204. %       { pop$ "EmPtY " t * " in " * cite$ * warning$ }
  205. %       'output.nonnull
  206. %    }
  207. %    if$
  208. %  if$
  209. %}
  210.  
  211. %                    apalike needs this function because
  212. %                    the year has special punctuation;
  213. %                    apalike ignores the month
  214. FUNCTION {output.year.check}
  215. { year empty$
  216.     {
  217.       "empty year in " cite$ ", using label: " extra.label * * * warning$
  218.       write$
  219.       " (" extra.label * ")" *
  220.       mid.sentence 'output.state :=
  221.     }
  222.     { write$
  223.       " (" year * extra.label * ")" *
  224.       mid.sentence 'output.state :=
  225.     }
  226.   if$
  227. }
  228.  
  229. FUNCTION {output.bibitem}
  230. { newline$
  231.   "\bibitem[" write$
  232.   label write$
  233.   "]{" write$
  234.   cite$ write$
  235.   "}" write$
  236.   newline$
  237.   ""
  238.   before.all 'output.state :=
  239. }
  240.  
  241. FUNCTION {fin.entry}
  242. { add.period$
  243.   write$
  244.   newline$
  245. }
  246.  
  247. FUNCTION {new.block}
  248. { output.state before.all =
  249.     'skip$
  250.     { after.block 'output.state := }
  251.   if$
  252. }
  253.  
  254. FUNCTION {new.sentence}
  255. { output.state after.block =
  256.     'skip$
  257.     { output.state before.all =
  258.     'skip$
  259.     { after.sentence 'output.state := }
  260.       if$
  261.     }
  262.   if$
  263. }
  264.  
  265. FUNCTION {not}
  266. {   { #0 }
  267.     { #1 }
  268.   if$
  269. }
  270.  
  271. FUNCTION {and}
  272. {   'skip$
  273.     { pop$ #0 }
  274.   if$
  275. }
  276.  
  277. FUNCTION {or}
  278. {   { pop$ #1 }
  279.     'skip$
  280.   if$
  281. }
  282.  
  283. FUNCTION {new.block.checkb}
  284. { empty$
  285.   swap$ empty$
  286.   and
  287.     'skip$
  288.     'new.block
  289.   if$
  290. }
  291.  
  292. FUNCTION {field.or.null}
  293. { duplicate$ empty$
  294.     { pop$ "" }
  295.     'skip$
  296.   if$
  297. }
  298.  
  299. FUNCTION {emphasize}
  300. { duplicate$ empty$
  301.     { pop$ "" }
  302.     { "{\em " swap$ * "}" * }
  303.   if$
  304. }
  305.  
  306. INTEGERS { nameptr namesleft numnames }
  307.  
  308. FUNCTION {format.names}
  309. { 's :=
  310.   #1 'nameptr :=
  311.   s num.names$ 'numnames :=
  312.   numnames 'namesleft :=
  313.     { namesleft #0 > }
  314.     { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=   % last name first
  315.       nameptr #1 >
  316.     { namesleft #1 >
  317.         { ", " * t * }
  318.         { numnames #2 >
  319.         { "," * }
  320.         'skip$
  321.           if$
  322.           t "others" =
  323.         { " {\em et~al.}" * }
  324.         { " \& " * t * }
  325.           if$
  326.         }
  327.       if$
  328.     }
  329.     't
  330.       if$
  331.       nameptr #1 + 'nameptr :=
  332.       namesleft #1 - 'namesleft :=
  333.     }
  334.   while$
  335. }
  336.  
  337. FUNCTION {format.authors}
  338. { author empty$
  339.     { "" }
  340.     { author format.names }
  341.   if$
  342. }
  343.  
  344. FUNCTION {format.key}            % this function is just for apalike
  345. { empty$
  346.     { key field.or.null }
  347.     { "" }
  348.   if$
  349. }
  350.  
  351. FUNCTION {format.editors}
  352. { editor empty$
  353.     { "" }
  354.     { editor format.names
  355.       editor num.names$ #1 >
  356.     { ", eds" * } % TDS
  357.     { ", ed" * } % TDS
  358.       if$
  359.     }
  360.   if$
  361. }
  362.  
  363. FUNCTION {format.title}
  364. { title empty$
  365.     { "" }
  366.     { % decide whether to give the title or not
  367.        givetitles #1 =
  368.        { title "t" change.case$ } % produce the title
  369.        { title pop$ "" }          % don't produce the title
  370.        if$
  371.     }
  372.   if$
  373. }
  374.  
  375. FUNCTION {n.dashify}
  376. { 't :=
  377.   ""
  378.     { t empty$ not }
  379.     { t #1 #1 substring$ "-" =
  380.     { t #1 #2 substring$ "--" = not
  381.         { "--" *
  382.           t #2 global.max$ substring$ 't :=
  383.         }
  384.         {   { t #1 #1 substring$ "-" = }
  385.         { "-" *
  386.           t #2 global.max$ substring$ 't :=
  387.         }
  388.           while$
  389.         }
  390.       if$
  391.     }
  392.     { t #1 #1 substring$ *
  393.       t #2 global.max$ substring$ 't :=
  394.     }
  395.       if$
  396.     }
  397.   while$
  398. }
  399.  
  400. FUNCTION {format.btitle}
  401. { title emphasize
  402. }
  403.  
  404. FUNCTION {tie.or.space.connect}
  405. { duplicate$ text.length$ #3 <
  406.     { "~" }
  407.     { " " }
  408.   if$
  409.   swap$ * *
  410. }
  411.  
  412. FUNCTION {either.or.check}
  413. { empty$
  414.     'pop$
  415.     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  416.   if$
  417. }
  418.  
  419. FUNCTION {format.bvolume}
  420. { volume empty$
  421.     { "" }
  422.     { "volume" volume tie.or.space.connect
  423.       series empty$
  424.     'skip$
  425.     { " of " * series emphasize * }
  426.       if$
  427.       "volume and number" number either.or.check
  428.     }
  429.   if$
  430. }
  431.  
  432. FUNCTION {format.number.series}
  433. { volume empty$
  434.     { number empty$
  435.     { series field.or.null }
  436.     { output.state mid.sentence =
  437.         { "number" }
  438.         { "Number" }
  439.       if$
  440.       number tie.or.space.connect
  441.       series empty$
  442.         { "there's a number but no series in " cite$ * warning$ }
  443.         { " in " * series * }
  444.       if$
  445.     }
  446.       if$
  447.     }
  448.     { "" }
  449.   if$
  450. }
  451.  
  452. FUNCTION {format.edition}
  453. { edition empty$
  454.     { "" }
  455.     { output.state mid.sentence =
  456.     { edition "l" change.case$ " edition" * }
  457.     { edition "t" change.case$ " edition" * }
  458.       if$
  459.     }
  460.   if$
  461. }
  462.  
  463. INTEGERS { multiresult }
  464.  
  465. FUNCTION {multi.page.check}
  466. { 't :=
  467.   #0 'multiresult :=
  468.     { multiresult not
  469.       t empty$ not
  470.       and
  471.     }
  472.     { t #1 #1 substring$
  473.       duplicate$ "-" =
  474.       swap$ duplicate$ "," =
  475.       swap$ "+" =
  476.       or or
  477.     { #1 'multiresult := }
  478.     { t #2 global.max$ substring$ 't := }
  479.       if$
  480.     }
  481.   while$
  482.   multiresult
  483. }
  484.  
  485. FUNCTION {format.pages}
  486. { pages empty$
  487.     { "" }
  488.     { pages multi.page.check
  489.     { "pp." pages n.dashify tie.or.space.connect } % TDS
  490.     { "p." pages tie.or.space.connect } % TDS
  491.       if$
  492.     }
  493.   if$
  494. }
  495.  
  496. FUNCTION {format.vol.num.pages}
  497. { "{\bf " volume "}" * * field.or.null  % make volume bold face
  498.   number empty$
  499.     'skip$
  500.     { " (" number * ")" * *
  501.        volume empty$
  502.     { "there's a number but no volume in " cite$ * warning$ }
  503.     'skip$
  504.       if$
  505.     }
  506.   if$
  507.   pages empty$
  508.     'skip$
  509.     { duplicate$ empty$
  510.     { pop$ format.pages }
  511. %    { ":" * pages n.dashify * } % no more colons after the volume
  512.     { ", " * pages n.dashify * } % comma's instead
  513.       if$
  514.     }
  515.   if$
  516. }
  517.  
  518. FUNCTION {format.chapter.pages}
  519. { chapter empty$
  520.     'format.pages
  521.     { type empty$
  522.     { "chapter" }
  523.     { type "l" change.case$ }
  524.       if$
  525.       chapter tie.or.space.connect
  526.       pages empty$
  527.     'skip$
  528.     { ", " * format.pages * }
  529.       if$
  530.     }
  531.   if$
  532. }
  533.  
  534. FUNCTION {format.in.ed.booktitle}
  535. { booktitle empty$
  536.     { "" }
  537.     { editor empty$
  538.     { "In: " booktitle emphasize * } % TDS
  539.     { "In: " booktitle emphasize * ", " *
  540.           "(" format.editors ")" * * * } % TDS
  541.       if$
  542.     }
  543.   if$
  544. }
  545.  
  546. FUNCTION {format.thesis.type}
  547. { type empty$
  548.     'skip$
  549.     { pop$
  550.       type "t" change.case$
  551.     }
  552.   if$
  553. }
  554.  
  555. FUNCTION {format.tr.number}
  556. { type empty$
  557.     { "Technical Report" }
  558.     'type
  559.   if$
  560.   number empty$
  561.     { "t" change.case$ }
  562.     { number tie.or.space.connect }
  563.   if$
  564. }
  565.  
  566. FUNCTION {format.article.crossref}
  567. { "In:"                % this is for apalike % TDS
  568.   " \cite{" * crossref * "}" *
  569. }
  570.  
  571. FUNCTION {format.book.crossref}
  572. { volume empty$
  573.     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
  574.       "In: " % TDS
  575.     }
  576.     { "Volume" volume tie.or.space.connect
  577.       " of " *
  578.     }
  579.   if$
  580.   "\cite{" * crossref * "}" *                % this is for apalike
  581. }
  582.  
  583. FUNCTION {format.incoll.inproc.crossref}
  584. { "In:"                % this is for apalike % TDS
  585.   " \cite{" * crossref * "}" *
  586. }
  587.  
  588. FUNCTION {article}
  589. {
  590.   cite$ "TitlesOn" =
  591.   'skip$ % Don't write out an article of this kind, it's a toggle switch!
  592.   {
  593.   output.bibitem
  594.   format.authors "author" output.check
  595.   author format.key output                % special for
  596.   output.year.check                    % apalike
  597.   new.block
  598.   format.title "title" output.check
  599.   new.block
  600.   crossref missing$
  601.     { % figure out the last character of the journal name.
  602.       % "<<" journal #-1 #1 substring$ ">>" * *  % for testing
  603.       % "<" journal ">" * *  % this works ok     % for testing
  604.  
  605.       journal #-1 #1 substring$ "." =
  606.       { journal }  % journal ended in period so don't do anything
  607.       { journal ", " *}  % journal ended without period, so add comma
  608.       if$
  609.       emphasize "journal" output.check
  610.  
  611. %      journal * emphasize "journal" output.check % the original method
  612.  
  613.       format.vol.num.pages output
  614.     }
  615.     { format.article.crossref output.nonnull
  616.       format.pages output
  617.     }
  618.   if$
  619.   new.block
  620.   note output
  621.   fin.entry
  622.   }
  623.   if$
  624. }
  625.  
  626. FUNCTION {book}
  627. { output.bibitem
  628.   author empty$
  629.     { format.editors "author and editor" output.check
  630.       editor format.key output
  631.     }
  632.     { format.authors output.nonnull
  633.       crossref missing$
  634.     { "author and editor" editor either.or.check }
  635.     'skip$
  636.       if$
  637.     }
  638.   if$
  639.   output.year.check                % special for apalike
  640.   new.block
  641.   format.btitle "title" output.check
  642.   #1 'docomma :=    % TURN COMMAS ON FOR JMB
  643.   crossref missing$
  644.     {
  645.       format.bvolume output
  646.       new.block
  647.       format.number.series output
  648.       new.sentence
  649.          #0 'docomma := % no comma after address
  650.       address ":" * output % TDS
  651.       publisher "publisher" output.check % TDS
  652.          #1 'docomma := % comma back on
  653. %      publisher "publisher" output.check
  654. %      address output
  655.     }
  656.     { new.block
  657.       format.book.crossref output.nonnull
  658.     }
  659.   if$
  660.   format.edition output
  661.   new.block
  662.   note output
  663.   fin.entry
  664.   #0 'docomma :=    % TURN COMMAS OFF
  665. }
  666.  
  667. FUNCTION {booklet}
  668. { output.bibitem
  669.   format.authors output
  670.   author format.key output                % special for
  671.   output.year.check                    % apalike
  672.   new.block
  673.   format.title "title" output.check
  674.   new.block
  675.   howpublished output
  676.   address output
  677.   new.block
  678.   note output
  679.   fin.entry
  680. }
  681.  
  682. FUNCTION {inbook}
  683. { output.bibitem
  684.   author empty$
  685.     { format.editors "author and editor" output.check
  686.       editor format.key output
  687.     }
  688.     { format.authors output.nonnull
  689.       crossref missing$
  690.     { "author and editor" editor either.or.check }
  691.     'skip$
  692.       if$
  693.     }
  694.   if$
  695.   output.year.check                % special for apalike
  696.   new.block
  697.   format.btitle "title" output.check
  698.   crossref missing$
  699.     { format.bvolume output
  700.       format.chapter.pages "chapter and pages" output.check
  701.       new.block
  702.       format.number.series output
  703.       new.sentence
  704.          #0 'docomma := % no comma after address
  705.       address ":" * output % TDS
  706.       publisher "publisher" output.check % TDS
  707.          #1 'docomma := % comma back on
  708. %      publisher "publisher" output.check
  709. %      address output
  710.     }
  711.     { format.chapter.pages "chapter and pages" output.check
  712.       new.block
  713.       format.book.crossref output.nonnull
  714.     }
  715.   if$
  716.   format.edition output
  717.   new.block
  718.   note output
  719.   fin.entry
  720. }
  721.  
  722. FUNCTION {incollection}
  723. { output.bibitem
  724.   format.authors "author" output.check
  725.   author format.key output                % special for
  726.   output.year.check                    % apalike
  727.   new.block
  728.   format.title "title" output.check
  729.   new.block
  730.   crossref missing$
  731.     { format.in.ed.booktitle "booktitle" output.check
  732.       format.bvolume output
  733.       format.number.series output
  734.       format.chapter.pages output
  735.       new.sentence
  736.       publisher "publisher" output.check
  737.       address output
  738.       format.edition output
  739.     }
  740.     { format.incoll.inproc.crossref output.nonnull
  741.       format.chapter.pages output
  742.     }
  743.   if$
  744.   new.block
  745.   note output
  746.   fin.entry
  747. }
  748.  
  749. FUNCTION {inproceedings}
  750. { output.bibitem
  751.   format.authors "author" output.check
  752.   author format.key output                % special for
  753.   output.year.check                    % apalike
  754.   new.block
  755.   format.title "title" output.check
  756.   new.block
  757.   crossref missing$
  758.     {
  759. %      #1 'docomma :=    % TURN COMMAS ON FOR JMB, BUT NOT FOR JTB: inconsistent
  760.       format.in.ed.booktitle "booktitle" output.check
  761.       format.bvolume output
  762.       format.number.series output
  763.       format.pages "," * output % TDS toss in comma instead of period
  764. %      address output % TDS address is below for JTB
  765. %      new.sentence % TDS remove period
  766.       organization output
  767.          #0 'docomma := % NO COMMA AFTER ADDRESS
  768.       address ":" * output % TDS
  769.       publisher "publisher" output.check % TDS
  770.          #1 'docomma := % comma back on
  771.  
  772. %      publisher output                    % are simpler
  773.       #0 'docomma :=    % TURN COMMAS OFF
  774.     }
  775.     { format.incoll.inproc.crossref output.nonnull
  776.       format.pages output
  777.     }
  778.   if$
  779.   new.block
  780.   note output
  781.   fin.entry
  782. }
  783.  
  784. FUNCTION {conference} { inproceedings }
  785.  
  786. FUNCTION {manual}
  787. { output.bibitem
  788.   format.authors output
  789.   author format.key output                % special for
  790.   output.year.check                    % apalike
  791.   new.block
  792.   format.btitle "title" output.check
  793.   organization address new.block.checkb
  794.   organization output
  795.   address output
  796.   format.edition output
  797.   new.block
  798.   note output
  799.   fin.entry
  800. }
  801.  
  802. FUNCTION {mastersthesis}
  803. { output.bibitem
  804.   format.authors "author" output.check
  805.   author format.key output                % special for
  806.   output.year.check                    % apalike
  807.   new.block
  808.   format.title "title" output.check
  809.   new.block
  810.   "Master's thesis" format.thesis.type output.nonnull
  811.   school "school" output.check
  812.   address output
  813.   new.block
  814.   note output
  815.   fin.entry
  816. }
  817.  
  818. FUNCTION {misc}
  819. { output.bibitem
  820.   format.authors output
  821.   author format.key output                % special for
  822.   output.year.check                    % apalike
  823.   new.block
  824.   format.title output
  825.   new.block
  826.   howpublished output
  827.   new.block
  828.   note output
  829.   fin.entry
  830. }
  831.  
  832. FUNCTION {phdthesis}
  833. { output.bibitem
  834.   format.authors "author" output.check
  835.   author format.key output                % special for
  836.   output.year.check                    % apalike
  837.   new.block
  838.   format.btitle "title" output.check
  839.   new.block
  840.   "PhD thesis" format.thesis.type output.nonnull
  841.   school "school" output.check
  842.   address output
  843.   new.block
  844.   note output
  845.   fin.entry
  846. }
  847.  
  848. FUNCTION {proceedings}
  849. { output.bibitem
  850.   format.editors output
  851.   editor format.key output                % special for
  852.   output.year.check                    % apalike
  853.   new.block
  854.   format.btitle "title" output.check
  855.   format.bvolume output
  856.   format.number.series output
  857.   address output                % for apalike
  858.   new.sentence                    % we always output
  859.   organization output                % a nonempty organization
  860.   publisher output                % here
  861.   new.block
  862.   note output
  863.   fin.entry
  864. }
  865.  
  866. FUNCTION {techreport}
  867. { output.bibitem
  868.   format.authors "author" output.check
  869.   author format.key output                % special for
  870.   output.year.check                    % apalike
  871.   new.block
  872.   format.title "title" output.check
  873.   new.block
  874.   format.tr.number output.nonnull
  875.   institution "institution" output.check
  876.   address output
  877.   new.block
  878.   note output
  879.   fin.entry
  880. }
  881.  
  882. FUNCTION {unpublished}
  883. { output.bibitem
  884.   format.authors "author" output.check
  885.   author format.key output                % special for
  886.   output.year.check                    % apalike
  887.   new.block
  888.  
  889. % Since format.title is out of commission, the original method won't work:
  890. %  format.title "title" output.check
  891. % so do the equivalent of the format.title procedure: (TDS)
  892.   title empty$
  893.     { "" }
  894.     { title "t" change.case$ } % produce the title
  895.   if$
  896.   "title" output.check
  897.  
  898.   new.block
  899.   note "note" output.check
  900.   fin.entry
  901. }
  902.  
  903. FUNCTION {default.type} { misc }
  904.  
  905. MACRO {jan} {"January"}
  906.  
  907. MACRO {feb} {"February"}
  908.  
  909. MACRO {mar} {"March"}
  910.  
  911. MACRO {apr} {"April"}
  912.  
  913. MACRO {may} {"May"}
  914.  
  915. MACRO {jun} {"June"}
  916.  
  917. MACRO {jul} {"July"}
  918.  
  919. MACRO {aug} {"August"}
  920.  
  921. MACRO {sep} {"September"}
  922.  
  923. MACRO {oct} {"October"}
  924.  
  925. MACRO {nov} {"November"}
  926.  
  927. MACRO {dec} {"December"}
  928.  
  929. MACRO {acmcs} {"ACM Computing Surveys"}
  930.  
  931. MACRO {acta} {"Acta Informatica"}
  932.  
  933. MACRO {cacm} {"Communications of the ACM"}
  934.  
  935. MACRO {ibmjrd} {"IBM Journal of Research and Development"}
  936.  
  937. MACRO {ibmsj} {"IBM Systems Journal"}
  938.  
  939. MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
  940.  
  941. MACRO {ieeetc} {"IEEE Transactions on Computers"}
  942.  
  943. MACRO {ieeetcad}
  944.  {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
  945.  
  946. MACRO {ipl} {"Information Processing Letters"}
  947.  
  948. MACRO {jacm} {"Journal of the ACM"}
  949.  
  950. MACRO {jcss} {"Journal of Computer and System Sciences"}
  951.  
  952. MACRO {scp} {"Science of Computer Programming"}
  953.  
  954. MACRO {sicomp} {"SIAM Journal on Computing"}
  955.  
  956. MACRO {tocs} {"ACM Transactions on Computer Systems"}
  957.  
  958. MACRO {tods} {"ACM Transactions on Database Systems"}
  959.  
  960. MACRO {tog} {"ACM Transactions on Graphics"}
  961.  
  962. MACRO {toms} {"ACM Transactions on Mathematical Software"}
  963.  
  964. MACRO {toois} {"ACM Transactions on Office Information Systems"}
  965.  
  966. MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
  967.  
  968. MACRO {tcs} {"Theoretical Computer Science"}
  969.  
  970. READ
  971.  
  972. % ***********************************************************
  973.  
  974. FUNCTION {check.for.titlecommand}
  975. % go through each entry and see if one of them has the key
  976. % 'TitlesOn'.  If this is found, then do titles!
  977. % 1989 November 18 TDS
  978. {
  979. %  "|" label "|" * * write$ newline$  % |Arrhenius {\em et~al.}, 1986|
  980. %  "|" cite$ "|" * * write$ newline$  % |Arrhenius1986|
  981. % so cite$ is the thing I want to detect...
  982.  
  983.   cite$ "TitlesOn" =
  984.   { % got it!
  985. %    "FOUND TitlesOn" write$ newline$
  986.      "Titles Will Be Printed" warning$
  987.     #1 'givetitles := % give titles!
  988.   }
  989.   'skip$
  990.   if$
  991. }
  992. EXECUTE {init.toggle.switches}
  993. ITERATE {check.for.titlecommand}
  994. % ***********************************************************
  995.  
  996. FUNCTION {sortify}
  997. { purify$
  998.   "l" change.case$
  999. }
  1000.  
  1001. INTEGERS { len }
  1002.  
  1003. FUNCTION {chop.word}
  1004. { 's :=
  1005.   'len :=
  1006.   s #1 len substring$ =
  1007.     { s len #1 + global.max$ substring$ }
  1008.     's
  1009.   if$
  1010. }
  1011.  
  1012. %            There are three apalike cases: one person (Jones),
  1013. %            two (Jones and de~Bruijn), and more (Jones et~al.).
  1014. %            This function is much like format.crossref.editors.
  1015. %
  1016. FUNCTION {format.lab.names}
  1017. { 's :=
  1018.   s #1 "{vv~}{ll}" format.name$
  1019.   s num.names$ duplicate$
  1020.   #2 >
  1021.     { pop$ " {\em et~al.}" * }
  1022.     { #2 <
  1023.     'skip$
  1024.     { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
  1025.         { " {\em et~al.}" * }
  1026.         { " \& " * s #2 "{vv~}{ll}" format.name$ * }
  1027.             % note new use of & rather than `and'.  TDS
  1028.       if$
  1029.     }
  1030.       if$
  1031.     }
  1032.   if$
  1033. }
  1034.  
  1035. FUNCTION {author.key.label}
  1036. { author empty$
  1037.     { key empty$
  1038.     { cite$ #1 #3 substring$ }
  1039.     'key                    % apalike uses the whole key
  1040.       if$
  1041.     }
  1042.     { author format.lab.names }
  1043.   if$
  1044. }
  1045.  
  1046. FUNCTION {author.editor.key.label}
  1047. { author empty$
  1048.     { editor empty$
  1049.     { key empty$
  1050.         { cite$ #1 #3 substring$ }
  1051.         'key                % apalike uses the whole key
  1052.       if$
  1053.     }
  1054.     { editor format.lab.names }
  1055.       if$
  1056.     }
  1057.     { author format.lab.names }
  1058.   if$
  1059. }
  1060.  
  1061. FUNCTION {editor.key.label}
  1062. { editor empty$
  1063.     { key empty$
  1064.     { cite$ #1 #3 substring$ }
  1065.     'key            % apalike uses the whole key, no organization
  1066.       if$
  1067.     }
  1068.     { editor format.lab.names }
  1069.   if$
  1070. }
  1071.  
  1072. FUNCTION {calc.label}
  1073. { type$ "book" =
  1074.   type$ "inbook" =
  1075.   or
  1076.     'author.editor.key.label
  1077.     { type$ "proceedings" =
  1078.     'editor.key.label            % apalike ignores organization
  1079.     'author.key.label            % for labeling and sorting
  1080.       if$
  1081.     }
  1082.   if$
  1083.   ", "                            % these three lines are
  1084.   *                            % for apalike, which
  1085.   year field.or.null purify$ #-1 #4 substring$        % uses all four digits
  1086.   *
  1087.   'label :=
  1088. }
  1089.  
  1090. FUNCTION {sort.format.names}
  1091. { 's :=
  1092.   #1 'nameptr :=
  1093.   ""
  1094.   s num.names$ 'numnames :=
  1095.   numnames 'namesleft :=
  1096.     { namesleft #0 > }
  1097.     { nameptr #1 >
  1098.     { "   " * }
  1099.     'skip$
  1100.       if$                        % apalike uses initials
  1101.       s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't := % <= here
  1102.       nameptr numnames = t "others" = and
  1103.     { "{\em et al}" * }
  1104.     { t sortify * }
  1105.       if$
  1106.       nameptr #1 + 'nameptr :=
  1107.       namesleft #1 - 'namesleft :=
  1108.     }
  1109.   while$
  1110. }
  1111.  
  1112. FUNCTION {sort.format.title}
  1113. { 't :=
  1114.   "A " #2
  1115.     "An " #3
  1116.       "The " #4 t chop.word
  1117.     chop.word
  1118.   chop.word
  1119.   sortify
  1120.   #1 global.max$ substring$
  1121. }
  1122.  
  1123. FUNCTION {author.sort}
  1124. { author empty$
  1125.     { key empty$
  1126.     { "to sort, need author or key in " cite$ * warning$
  1127.       ""
  1128.     }
  1129.     { key sortify }
  1130.       if$
  1131.     }
  1132.     { author sort.format.names }
  1133.   if$
  1134. }
  1135.  
  1136. FUNCTION {author.editor.sort}
  1137. { author empty$
  1138.     { editor empty$
  1139.     { key empty$
  1140.         { "to sort, need author, editor, or key in " cite$ * warning$
  1141.           ""
  1142.         }
  1143.         { key sortify }
  1144.       if$
  1145.     }
  1146.     { editor sort.format.names }
  1147.       if$
  1148.     }
  1149.     { author sort.format.names }
  1150.   if$
  1151. }
  1152.  
  1153. FUNCTION {editor.sort}
  1154. { editor empty$
  1155.     { key empty$
  1156.     { "to sort, need editor or key in " cite$ * warning$
  1157.       ""
  1158.     }
  1159.     { key sortify }
  1160.       if$
  1161.     }
  1162.     { editor sort.format.names }
  1163.   if$
  1164. }
  1165.  
  1166. %            apalike uses two sorting passes; the first one sets the
  1167. %            labels so that the `a's, `b's, etc. can be computed;
  1168. %            the second pass puts the references in "correct" order.
  1169. %            The presort function is for the first pass. It computes
  1170. %            label, sort.label, and title, and then concatenates.
  1171. FUNCTION {presort}
  1172. { calc.label
  1173.   label sortify
  1174.   "    "
  1175.   *
  1176.   type$ "book" =
  1177.   type$ "inbook" =
  1178.   or
  1179.     'author.editor.sort
  1180.     { type$ "proceedings" =
  1181.     'editor.sort
  1182.     'author.sort
  1183.       if$
  1184.     }
  1185.   if$
  1186.   #1 entry.max$ substring$    % for
  1187.   'sort.label :=        % apalike
  1188.   sort.label            % style
  1189.   *
  1190.   "    "
  1191.   *
  1192.   title field.or.null
  1193.   sort.format.title
  1194.   *
  1195.   #1 entry.max$ substring$
  1196.   'sort.key$ :=
  1197. }
  1198.  
  1199. ITERATE {presort}
  1200.  
  1201. SORT        % by label, sort.label, title---for final label calculation
  1202.  
  1203. STRINGS { last.label next.extra }    % apalike labels are only for the text;
  1204.  
  1205. INTEGERS { last.extra.num }        % there are none in the bibliography
  1206.  
  1207. FUNCTION {initialize.extra.label.stuff}    % and hence there is no `longest.label'
  1208. { #0 int.to.chr$ 'last.label :=
  1209.   "" 'next.extra :=
  1210.   #0 'last.extra.num :=
  1211. }
  1212.  
  1213. FUNCTION {forward.pass}
  1214. % pass through the references forward
  1215. {
  1216. %"\\     label=" label "//" * * write$ newline$ % display the label
  1217. %"\\last.label=" last.label "//" * * write$ newline$ % display the label
  1218.  
  1219.  last.label label =   % if the label repeats the previous label...
  1220.     { % then increment the extra number
  1221.       last.extra.num #1 + 'last.extra.num :=
  1222.       % and convert it to a label
  1223.       last.extra.num int.to.chr$ 'extra.label :=
  1224.     }
  1225.     { % else set things up for the next entry
  1226.       "a" chr.to.int$ 'last.extra.num :=
  1227.  
  1228.       % However, if the year was missing, tack on an extra "a". TDS
  1229.       year empty$
  1230.       {"a" 'extra.label :=}
  1231.       {"" 'extra.label :=}
  1232.       if$
  1233.  
  1234. %      "" 'extra.label :=  % the original method was not to do anything TDS
  1235.  
  1236.       label 'last.label :=   % capture this label for next time
  1237.     }
  1238.   if$
  1239. %"\\extra.label = " extra.label "//" * * write$ newline$ % display the label
  1240. }
  1241.  
  1242. FUNCTION {reverse.pass}
  1243. % pass through the references backwards
  1244. % add extra characters to the end of the label string
  1245. {
  1246. %"{{" label "}}" * * write$ newline$ % display the label
  1247.  next.extra "b" =
  1248. % original logic:
  1249.     { "a" 'extra.label := }
  1250.     'skip$
  1251.     if$
  1252.  
  1253. % next.extra "b" = { "next.extra was = b" write$ newline$} 'skip$ if$
  1254.  
  1255. % new as of 1989 Oct 18
  1256. %    { "a" 'extra.label := }
  1257. %    { % Put on an "a" at the end of the label if the year is missing. TDS
  1258. %      year empty$
  1259. %       { "a" 'extra.label := }
  1260. %       %{ label "a" * 'label := }
  1261. %       'skip$ % otherwise leave it alone (orignial method)
  1262. %     if$ }
  1263. %  if$
  1264.  
  1265.   label extra.label * 'label :=
  1266.   extra.label 'next.extra :=
  1267. %"{{" label "}}" * * write$ newline$ % display the label
  1268. }
  1269.  
  1270. FUNCTION {bib.sort.order}
  1271. % Generate the sort.key$ variables for sorting.
  1272. % The sorting is first on the sort.label (ie, author's name), followed
  1273. % by the year then the title.  If there is no year, the cite$ is used.
  1274. {
  1275.   sort.label  % this is based on the author name
  1276.   "    " * % tack on some space
  1277. % original apa command was to use the year or an empty string:
  1278. %  year field.or.null sortify
  1279. % Replace that with the use of the cite$, when there is no year:
  1280.   year duplicate$ empty$
  1281.      {pop$ cite$}
  1282.      'skip$
  1283.   if$
  1284.  
  1285.   * "    " *  % tack on some space
  1286.  
  1287. % I CAN'T STAND SORTING ON TITLE!!! TDS 1989 Dec 5
  1288. %  title field.or.null
  1289. %  sort.format.title
  1290. %  * % attach them together
  1291.   cite$
  1292.   * % use cite$ instead!!
  1293.  
  1294.   % note: if there is no year, then the cite$ will override the sorting
  1295.   % on the title.  Oh well.  Title sorting is sorta (ha ha) awful.
  1296.  
  1297.   #1 entry.max$ substring$
  1298.   'sort.key$ :=
  1299.  
  1300.   % The following line helps debug the program.  It shows what the sort.key$ is.
  1301.   % "%" sort.key$ * write$ newline$
  1302. }
  1303.  
  1304. % Here is the place that the actual executions of the labeling and sorting
  1305. % functions are done.
  1306.  
  1307.  
  1308. EXECUTE {initialize.extra.label.stuff} % initialize variables
  1309. ITERATE {bib.sort.order}               % set up the sorting keys
  1310. SORT        % by sort.label, year, title---giving final bibliography order
  1311. % Having sorted NOW we apply the extra letters at the end!
  1312. ITERATE {forward.pass}
  1313. REVERSE {reverse.pass}
  1314.  
  1315. FUNCTION {begin.bib}
  1316. { preamble$ empty$                % no \etalchar in apalike
  1317.     'skip$
  1318.     { preamble$ write$ newline$ }
  1319.   if$
  1320.   "\begin{thebibliography}{}" write$ newline$        % no labels in apalike
  1321. }
  1322.  
  1323. EXECUTE {begin.bib}
  1324.  
  1325. EXECUTE {init.state.consts}
  1326.  
  1327. ITERATE {call.type$}
  1328.  
  1329. FUNCTION {end.bib}
  1330. { newline$
  1331.   "\end{thebibliography}" write$ newline$
  1332. }
  1333.  
  1334. EXECUTE {end.bib}
  1335.